package string;

import org.junit.Test;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class StringTest {
    /**
     * String的连接操作
     * 情况一：常量 + 常量 ：结果仍然存储在字符串常量池中，返回此字面量的地址。注：此时的常量可能是字面量，也可能是final修饰的常量。
     * 情况二：常量 + 变量 或 变量 + 变量：都会通过new的方式创建一个新的字符串，返回对空间中此字符串对象的地址。
     * 情况三：调用字符串的intern()：返回的是字符串常量池中字面量的地址
     */
    @Test
    public void test1() {
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        String s4 = new String("hello");

        System.out.println(s1 == s2); // true
        System.out.println(s1 == s3); // false
        System.out.println(s3 == s4); // false
        System.out.println(s1.equals(s3));// true

        System.out.println("---------------");
        String string1 = "helloworld";
        String string2 = "hello" + "world";
        String string3 = s1 + "world";
        String string4 = s1 + s2;
        String str = "hello";
        String string5 = s3.intern() + "world";

        System.out.println(string1 == string2); //true
        System.out.println(string1 == string3); // false
        System.out.println(string1 == string4); // false
        System.out.println(string1 == string5); // false
        System.out.println(string1 == string5.intern());// true
        System.out.println(string1.equals(string5)); // true
    }

    @Test
    public void test2() {
        final String s1 = "hello";
        final String s2 = "world";

        String string1 = "helloworld";
        String string2 = "hello" + "world";
        String string3 = s1 + "world";
        String string4 = s1 + s2;
        String string5 = "hello".concat("world");

        System.out.println(string1 == string2); //true
        System.out.println(string1 == string3); // true
        System.out.println(string1 == string4); // true
        System.out.println(string1 == string5); // false

    }

    /**
     * String与常见的其它结构之间的转换
     * <p>
     * 在 UTF-8 字符集中，一个汉字占用 3 个字节，一个字节占用 1 个字节。
     * 在 gbk 字符集中，一个汉字占用 2 个字节，一个字节占用 1 个字节。
     * <p>
     * UTF-8/GBK都向下兼容了ASCII码
     */
    @Test
    public void test3() throws UnsupportedEncodingException {
        String str = "hello中国";
        char[] charArray = str.toCharArray();
        System.out.println(charArray);
        System.out.println(Arrays.toString(str.getBytes()));
        byte[] bytes = str.getBytes("gbk");
        System.out.println(Arrays.toString(bytes));

        String string = new String(bytes, "gbk");
        System.out.println(string);
    }

    /**
     * String StringBuffer StringBuilder
     * 底层使用char[] (JDK8及之前)，底层使用byte[](JDK9及之后)
     * <p>
     * String:  不可变的字符序列；
     * StringBuffer:    可变的字符序列；JDK1.0声明，线程安全的，效率低。
     * StringBuilder:   可变的字符序列；JDK5.0声明，线程安全的，效率高。
     */
    @Test
    public void test4() {
        StringBuilder stringBuilder = new StringBuilder("null");
        System.out.println(stringBuilder.length());

    }
}
